home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
1833
/
1833.xpi
/
modules
/
yoonoService.js
< prev
next >
Wrap
Text File
|
2009-12-16
|
30KB
|
848 lines
var EXPORTED_SYMBOLS = ["YOONO_CMPT"];
Components.utils.import("resource://yoono/yoonoKeyValueDB.js");
Components.utils.import("resource://yoono/yoonoLog.js");
Components.utils.import("resource://yoono/yoonoPrefs.js");
Components.utils.import("resource://yoono/yoonoServerConnection.js");
Components.utils.import("resource://yoono/yoonoBkmSync.js");
Components.utils.import("resource://yoono/yoonoStorage.js");
try {
// Globals
const CI = Components.interfaces;
const CL = Components.classes;
const CONSOLESERVICE = CL["@mozilla.org/consoleservice;1"].getService(CI.nsIConsoleService);
const DIRSERVICE = CL['@mozilla.org/file/directory_service;1'].getService(CI.nsIProperties);
const YOONO_ID = "{d9284e50-81fc-11da-a72b-0800200c9a66}";
// yoono stuff
var yoono={};
var log = {info:function(m) {CONSOLESERVICE.logStringMessage(m);},
debug:function(m) {CONSOLESERVICE.logStringMessage(m);},
warn:function(m){CONSOLESERVICE.logStringMessage(m);},
error:function(m){CONSOLESERVICE.logStringMessage(m);},
fatal:function(m){CONSOLESERVICE.logStringMessage(m);}};
// List of preferences that must absolutely never be overriden by the server
// In case you need to add such a preference, just set it to true in the object below:
var safePreferences = {
bookmarksLastModified: true,
synchroaction: true,
synchroask : true,
syncid : true,
userid : true
}
// interfaces
const PREFSSERVICE = CL["@mozilla.org/preferences-service;1"].getService(CI.nsIPrefService);
const WMED = CL['@mozilla.org/appshell/window-mediator;1'].getService(CI.nsIWindowMediator);
const PREFS = PREFSSERVICE.getBranch("extensions.yoono.");
// chromeUI : le composant en lui meme
function chromeUI() {
this._started = false;
this.uninstallDone = false;
this.timerLogIn = CL['@mozilla.org/timer;1'].createInstance(CI.nsITimer);
// List of incompatible extensions. Ids MUST be lower case
this.dualSidebarIncompatibleExtensions = {
'{097d3191-e6fa-4728-9826-b533d755359d}' : 'All-in-One Sidebar',
'{0eaf175c-0c46-4932-ab7d-f45d6c46f367}' : 'Ez Sidebar'
};
// List of incompatible bkm sync extensions. Ids MUST be lower case
this.bkmSyncIncompatibleExtensions = {
'{18b9b035-67a2-4db6-bf42-3993ae4d89a7}' : 'Bookmarks on line',
'{66580a2f-7538-498d-b049-a540e77aad9d}' : 'AbstractMouse.com Shared Bookmarks',
'{e133f188-27e7-401d-be2e-804643793acb}' : 'Bookmarks Synchronizer',
'foxmarks@kei.com' : 'Foxmarks Bookmark Synchronizer',
'{32537848-7d38-4ee2-b5a2-47562e69c59e}' : 'Foxylicious',
'browserstate@google.com' : 'Google Browser Sync'
};
this.statDelay = 24 * 3600 ; // stats sent every 24 hours
this.uninstallWhenQuitting = false;
// initialisation of the component. (called by yoonoOverlay.js)
this.init = function (y) {
// ne s'execute qu'une seule fois par session
if (this._started)
return;
this._started = true;
yoono = y;
log = y.log;
// wait 5 seconds for sidebar to be ready before checking for stats
this.timerLogIn.initWithCallback(this, 5000 , this.timerLogIn.TYPE_ONE_SHOT);
this.startGlobalServices(yoono.yextif);
yoono.bkm.start(yoono);
};
/*******************/
/* Global services */
this._globalService = null;
this.getYServices = function () {
return this._globalService;
}
this.startGlobalServices = function (yextif) {
if (this._globalService) return;
try {
log.debug("loading global services with yextif = "+yextif);
// Get *the* hidden window
var hiddenWindow = Components.classes["@mozilla.org/appshell/appShellService;1"]
.getService(Components.interfaces.nsIAppShellService)
.hiddenDOMWindow;
var doc=hiddenWindow.document;
// Create our hidden iframe
var iframe=doc.createElement("iframe");
iframe.setAttribute("src","chrome://yoonosb/content/js/services/hiddenIFrame.html");
doc.lastChild.appendChild(iframe);
// Wait for load in order to retrieve global object for YServices
var _self=this;
iframe.addEventListener("load",function () {
try {
_self._globalService = iframe.contentWindow.loadServices(yextif);
} catch(e) {
log.exception(e);
}
}, true);
} catch(e) {
log.exception(e);
}
}
/* End global services */
//Timer to handle timeout on requests
var requestTimeoutTimer = function(request, handler) {
this._self = this;
this.request = request;
this.handler = handler;
this.timer = CL['@mozilla.org/timer;1'].createInstance(CI.nsITimer);
var delay = YOONO_PREFS.get('request.timeout') * 1000; // la pref est en secondes
this.timer.initWithCallback(this, delay, this.timer.TYPE_ONE_SHOT);
}
requestTimeoutTimer.prototype = {
notify : function(timer) {
try {
log.debug("Request " + this.request.tstamp + " timed out" );
this.request.abort();
// yoono.dialogs.setThrobberFailed();
if(this.handler)
this.handler(this.request, '');
// cleanup
try { this._self.destroy() } catch(e) {log.exception(e);}
finally { this._self = null }
} catch(e) {
log.exception(e);
}
}
}
// Wrapper method to be used when no headers are to be added to request
// (historic...)
// (don't use $this because this function is called without his environnement)
this.sendRequest = function(url, method, mode, body, handler) {
method = ('GET' == method)?'GET':'POST';
return (yoono.main.sendFullRequest(url, method, null, mode, body, handler));
}
// NOV 2006 : this is the sending method that must now be used almost throughout the application.
// @author : Xavier Grosjean
// @param url : destination url
// @param method : GET or POST
// @param headers : Object with headers names and values : headers['name'] = value
// @param mode : sync or async
// @param body : post payload. If xml, will be serialized and script= will be inserted at begining
// @param handler : handle for response (or null). Will receive request and xml result as param
// @returns array with request and result (xml response payload if not async)
this.sendFullRequest = function(url, method, headers, mode, body, handler) {
var req = null;
var result = '';
try {
req = CL["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(CI.nsIXMLHttpRequest);
req.tstamp = 'id #' + new Date().getTime();
log.info('Sending ' + mode + ' ' + method + ' on ' + url + "\n" + body + "\n>>>>>>>>>>>> end of request " + req.tstamp + " >>>>>>>>>>>>");
var b=body;
if('xml' == typeof(body)) body = 'script=' + encodeURIComponent(body.toString());
method = method.toUpperCase();
var async = ('async' == mode)?true:false;
req.open(method,url,async);
req.setRequestHeader("Cache-Control", "no-cache");
if('POST' == method) {
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
// If there are headers, add them ...
if(headers) {
for(var name in headers) {
req.setRequestHeader(name, encodeURIComponent(headers[name]));
}
}
// Initialize a timer to timeout the request if necessary
var timerRequest = new requestTimeoutTimer(req, handler);
req.onload = function (event) {
var result = '';
timerRequest.timer.cancel();
try {
var request = event.target;
var suggestUrl = '';
if((4 == request.readyState) && (200 == request.status)) {
try {
result = new XML(request.responseText.replace(/<\?xml.*?\?>\n?/g, ""));
} catch(e) {
log.error("Error parsing Response " + e);
log.error("Response Text: " + request.status + "\n" + request.responseText + "\n<<<<<<<<<<< end of response " + request.tstamp + "<<<<<<<<<<<");
yoono.dialogs.setThrobberFailed();
return;
}
log.info("Response " + request.status + "\n" + result + "\n<<<<<<<<<<< end of response <<<<<<<<<<< " + request.tstamp);
yoono.main.getServerContextData(result);
} else {
log.error("Response " + request.status );
yoono.dialogs.setThrobberFailed();
}
if(handler)
handler(request, result, body);
} catch(e) {
log.exception(e);
yoono.dialogs.setThrobberFailed();
}
};
req.onerror = function (e) {
try {
timerRequest.timer.cancel();
log.error("Request error on "+b );
yoono.dialogs.setThrobberFailed();
if(handler)
handler(req, 'error', body);
} catch(e) {
log.exception(e);
yoono.dialogs.setThrobberFailed();
}
};
req.send(body);
if(!async) {
if((4 == req.readyState) && (200 == req.status)) {
result = new XML(req.responseText.replace(/<\?xml.*?\?>\n?/g, ""));
yoono.main.getServerContextData(result);
}
}
} catch(e) {
log.exception(e);
yoono.dialogs.setThrobberFailed();
}
return (new Array(req, result));
}
this.notify = function(timer){
try {
this.checkStats();
} catch(e) {
log.exception(e);
}
};
//check if stats must be sent
this.checkStats = function(mode) {
var win = WMED.getMostRecentWindow("navigator:browser");
if (!win)
win = Components.classes["@mozilla.org/appshell/appShellService;1"]
.getService(Components.interfaces.nsIAppShellService)
.hiddenDOMWindow;
var offset = 0;
try {
// check if stats must be sent
// date is read in prefs cache so that not cheatable from about:config without relaunching FF
var dateNow = Math.round((new Date().getTime()) / 1000);
var dateStat = YOONO_PREFS.get('stats.last');
log.debug('YOONO_CMPT.checkStats checking stats, mode=' + mode + ', now=' + dateNow + ', previous=' + dateStat );
if((dateStat != 0) || mode) { // first call
if(mode || (dateNow >= (dateStat + this.statDelay))) {
var script = <server-script version="1.0"/>;
var context = <context>
<locale>{yoono.utils.getLocale()}</locale>
<version>{yoono.yextif.methods.getVersion()}</version>
<agent>{yoono.utils.getUserAgent(win)}</agent>
<appversion>{yoono.utils.getUserAgentAppVersion(win)}</appversion>
<oscpu>{yoono.utils.getUserAgentOsCpu(win)}</oscpu>
<platform>{yoono.utils.getUserAgentPlatform(win)}</platform>
<client>{yoono.yextif.methods.getClientType()}</client>
<user-id>{YOONO_PREFS.get('userid')}</user-id>
</context>;
script.appendChild(context);
var stat = null;
if(mode) {
stat = <stats begins={dateStat} ends={dateNow} command={mode}/>;
} else {
stat = <stats begins={dateStat} ends={dateNow}/>;
}
var statData = PREFSSERVICE.getBranch("extensions.yoono.stats.data.");
var childArray = statData.getChildList('', {});
var prefName = '';
var type = '';
var tag = null;
var value = 0;
var tagData = null;
for (var i = childArray.length ; i-- > 0 ; ) {
prefName = childArray[i];
type = statData.getPrefType(prefName);
// get bits from string using '.' as separator
tagData = prefName.split('.');
// re-join extra bits of string beyond the 3rd one.
if(tagData[3]) tagData[2] = tagData.splice(2).join('.');
prefName = 'stats.data.' + prefName;
value = YOONO_PREFS.get(prefName);
if(!value) continue;
tag = <{tagData[0]} />;
if(tagData[1]) tag.@type = tagData[1];
if(tagData[2]) tag.@ui = tagData[2];
tag.@value = value;
stat.appendChild(tag);
YOONO_PREFS.set(prefName, 0, type);
}
// Send the date each yoodget was displayed first
try {
var firstDisplayDates = YOONO_KEYVALUEDB.getKeyValueList('sidebarFirstDisplayDate');
var widgetName = '';
for(var aDisplayDateKey in firstDisplayDates) {
widgetName = aDisplayDateKey.replace(/sidebarFirstDisplayDate/, '');
stat.appendChild(<widget-first-displayed ui={widgetName} value={firstDisplayDates[aDisplayDateKey]}/>);
}
} catch(e){
log.exception(e);
}
// if code below fails, still send other stats
try {
stat.appendChild(<nosynchro value={YOONO_PREFS.get('nosynchro')}/>);
} catch(e){}
try {
var marketingCampaign = YOONO_KEYVALUEDB.getKeyValue('sidebarMarketingCampaign') || '0' ;
if('0' != marketingCampaign) {
stat.appendChild(<marketing type="campaign" value={marketingCampaign}/>);
}
} catch(e){}
try {
var yoodgetList = YOONO_KEYVALUEDB.getKeyValue('sidebarYoodgetList') || '' ;
// FF2 does not support JSON
// FF3.0 and FF3.1 support it a very different way, so fuck JSON
var tab = yoodgetList.match(/"yuid"/g);
var nb = 0;
if(tab) nb = tab.length;
stat.appendChild(<widget type="installed" value={nb}/>);
} catch(e){}
try {
var installDate = PREFS.getIntPref("install_date");
var age = dateNow - installDate;
stat.appendChild(<install_age value={age}/>);
} catch(e){}
var update = YOONO_PREFS.get('updated.from') || '';
if(update) {
stat.appendChild(<update old={update} new={YOONO_PREFS.get('release')} client={yoono.yextif.methods.getClientType()}/>);
YOONO_PREFS.set('updated.from', '', PREFS.PREF_STRING);
}
try {
var yoolinkEnabled = PREFS.getBoolPref("highlight.enable");
if (yoolinkEnabled)
stat.appendChild(<yoolink type="underline-enable" value="1" />);
else
stat.appendChild(<yoolink type="underline-disable" value="1" />);
} catch(e){}
script.appendChild(stat);
YOONO_PREFS.set('stats.last', dateNow, PREFS.PREF_INT);
// Check if stat must be sent.
// Check is done this late because if we don't send them we still want them to be reset
var noStat = YOONO_PREFS.get('stats.no') ;
if(noStat && ('manual' != mode)) {
log.debug('YOONO_CMPT.checkStats stats sending disabled' );
} else {
// Send a request to increment the counter of sent statistics
yoono.main.sendRequest(YOONO_PREFS.get('serverurl') + 'rest/counters/one/client-stats/send', 'POST', 'async', null, null);
// Send the statistics
var _self = this;
yoono.main.sendRequest(YOONO_PREFS.get('serverurl') + 'linkserver', 'POST', 'async',
script, function(request, result, body){_self.statResult(request, result, body)});
}
} else {
offset = dateNow - dateStat;
}
} else {
YOONO_PREFS.set('stats.last', dateNow, PREFS.PREF_INT);
}
} catch(e) {
log.exception(e);
}
// send stats every 24 hours
var delay = (this.statDelay - offset ) * 1000 ;
this.timerLogIn.initWithCallback(this, delay , this.timerLogIn.TYPE_ONE_SHOT);
};
this.statResult = function(request, result, body) {
var xml = request.responseXML;
if(!xml) {
yoono.main.sendRequest(YOONO_PREFS.get('serverurl') + 'rest/counters/one/client-stats-error/timeout', 'POST', 'async', null, null);
return;
}
var dom = xml.documentElement;
var msg = dom.getElementsByTagName('display-message');
if (msg && msg[0]) {
var code = msg[0].getAttribute('code');
// Send a request to increment the counter of sent statistics
yoono.main.sendRequest(YOONO_PREFS.get('serverurl') + 'rest/counters/one/client-stats-error/' + encodeURIComponent(code), 'POST', 'async', null, null);
}
};
// increments a stat counter in prefs
this.addStat = function(params, step) {
if(null == step) step = 1;
var namePref = 'stats.data.' + params.join('.');
var current = parseInt(YOONO_PREFS.get(namePref) || 0);
current += parseInt(step);
if(PREFS.PREF_INT != PREFS.getPrefType(namePref)) {
try {
// pref may not exist
PREFS.clearUserPref(namePref);
} catch(e) {}
}
YOONO_PREFS.set(namePref, current, PREFS.PREF_INT);
}
this.setStat = function(params, value) {
var namePref = 'stats.data.' + params.join('.');
var type = PREFS.PREF_INT;
if((value + 1) != (1 + value))
type = PREFS.PREF_STRING;
YOONO_PREFS.set(namePref, value, type);
}
this.inprogress = function () {
return yoono.dialogs._connecting;
};
// check if incompatible extension
this.checkIncompatibility = function(extensionArray) {
var extmgr = CL['@mozilla.org/extensions/manager;1'].getService(CI.nsIExtensionManager);
var result = false;
var extensionList = extmgr.getItemList(Components.interfaces.nsIUpdateItem.TYPE_ANY, {});
var extId = '';
for(var ind=0 ; ind < extensionList.length; ind ++) {
extId = extensionList[ind].id;
extId = extId.toLowerCase();
// TODO : check if disabled...not that easy...
if(extId in extensionArray) {
result = true;
log.debug('Incompatible extension detected: ' + extId);
}
}
return result;
};
this.getUserInfo = function(login, mode, handler) {
var async = ('async' == mode)?true:false;
var script = <server-script version="1.0"/> ;
script.appendChild( <context> <user-id>{login}</user-id> </context>);
script.appendChild( <get-user-data/>);
var url = YOONO_PREFS.get('serverurl') + 'linkserver';
result = yoono.main.sendRequest(url, 'POST', async, script, handler) ;
return (result);
};
// user may change his password anytime
this.getUserCredential = function() {
var userId = PREFS.getCharPref("userid");
if(!userId) return null;
var result = new Object;
// anonymous users have no ':' in their userid
if(!userId.match(':')) {
result.login = null;
result.password = null;
result.userId = userId;
result.anonymous = true;
} else {
var userData = userId.split(':');
result.userId = userId;
result.login = userData[0];
result.password = userData[1];
result.anonymous = false;
}
return(result);
};
this.escapeFileName = function(fileName) {
var escFileName = fileName.replace(/[\/\\" :]/g, '_');
return(escFileName);
};
this.registerUser = function (login, passwd) {
log.debug("Registering new user : login="+login);
YOONO_PREFS.set('userid', login + ':' + passwd, PREFS.PREF_STRING);
// must refresh user authentication data for memo handling
};
// Called from the sidebar to log an existing user installing the extension
this.changeUser = function(aNewuserId, aSyncMode) {
var currentCredentials = this.getUserCredential();
// When creating the account, currentCredentials are empty
if(!currentCredentials) {
currentCredentials = {
'userId': '',
'login' : ''
}
}
// If no change, nothing to do
if(currentCredentials.userId == aNewuserId) return;
var newCredentials = aNewuserId.split(':');
if( aSyncMode == null ) {
aSyncMode = 'manual-sync';
}
if (YOONO_PREFS.get('nosynchro')) {
aSyncMode = 'no-sync';
}
log.backtrace("Changing current user : aSyncMode="+aSyncMode);
YOONO_PREFS.set('userid', aNewuserId, PREFS.PREF_STRING);
// Switch database files only if login has changed (not password)
if(newCredentials[0] != currentCredentials.login) {
YOONO_STORAGE.switchDBStorage();
YOONO_KEYVALUEDB.closeDB(); // New db will open itself the first time it will be needed (wow !)
}
yoono.server.launch('connect',aSyncMode);
};
// Processing of server-sent preferences
this.getServerContextData = function(xml) {
try {
var contextPrefs = xml.context['client-prefs'];
var pref = '';
// toString is absolutely mandatory in comparaison operators
for each (var indP in contextPrefs.pref) {
pref = indP.@name.toString();
// Test if this pref is allowed to be overriden by a server pref
if(! (pref in safePreferences)) {
switch(indP.@type.toString()) {
case 'int':
YOONO_PREFS.set(pref, indP.@value, PREFS.PREF_INT);
break;
case 'string':
YOONO_PREFS.set(pref, indP.@value, PREFS.PREF_STRING);
break;
case 'bool':
YOONO_PREFS.set(pref, indP.@value, PREFS.PREF_BOOL);
break;
}
}
}
// Don't know why, but need to re-import module
Components.utils.import("resource://yoono/yoonoKeyValueDB.js");
var geoLocData = xml.context['geoloc'];
if(geoLocData) {
var ip = geoLocData.ip.toString();
var countryCode = geoLocData.country.@code.toString();
// Store data for sidebar access
if(ip) YOONO_KEYVALUEDB.setKeyValue('sidebarIpAddress', ip);
if(countryCode) YOONO_KEYVALUEDB.setKeyValue('sidebarCountryCode', countryCode);
}
var adsData = xml.context['ads'];
if(adsData) {
var mivaAuthToken = adsData.miva.toString();
// Store data for sidebar access
if(mivaAuthToken) YOONO_KEYVALUEDB.setKeyValue('sidebarMivaAuthToken', mivaAuthToken);
}
} catch(e) {
log.exception(e);
}
}
this.uninstallAddonWhenQuitting = function (yoonoItem) {
try {
var win = WMED.getMostRecentWindow("Extension:Manager");
this.goodbyeWizardReturnObject = null;
if(!this.uninstallWhenQuitting ) {
this.uninstallWhenQuitting = true;
// Ask user if he wants to remove his account and data on the server...
this.goodbyeWizardReturnObject = new Object;
// the returnObject will contain the script to send to the server, if any, when uninstalling
var userCredentials = this.getUserCredential();
if(userCredentials) {
log.debug("Goodbye popup");
yoono.dialogs.setDialog('goodbye', this.goodbyeWizardReturnObject);
log.debug("Returned from uninstall popup: " + this.goodbyeWizardReturnObject.value);
// If dialog canceled, cancel uninstallation
if(!this.goodbyeWizardReturnObject.value) {
log.debug("Cancelling uninstallation");
if(win) {
win.gExtensionsViewController.commands.cmd_cancelUninstall(yoonoItem);
win.focus();
} else {
var gExtensionManager = Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager);
gExtensionManager.cancelUninstallItem(YOONO_ID);
}
this.uninstallWhenQuitting = false;
// set addons window to front
return;
}
}
} else {
this.uninstallWhenQuitting = true;
}
if(this.uninstallWhenQuitting) {
log.debug("uninstallwhenquitting ...");
this.checkStats('uninstall'); // Force sending stats
// Close sidebar on each window so that extension does not try to make anymore access to preferences
// that no longer exist...
var _self = this;
yoono.dialogs.traverseBrowsers(function(traversedWindow) {_self.hideYoonoStuff(traversedWindow)});
if(win) {
win.focus();
}
}
} catch(e) {
log.exception(e);
}
}
// Fonction appelée lorsque l'extension doit etre désinstallée, au moment où on quitte firefox
this.uninstall = function () {
try {
log.debug("uninstallation");
if(this.goodbyeWizardReturnObject && this.goodbyeWizardReturnObject.script) {
var script = this.goodbyeWizardReturnObject.script;
var reqResult = yoono.main.sendRequest(YOONO_PREFS.get('serverurl') + 'linkserver', 'POST', 'sync', script, null);
try {
var response = reqResult[1];
var message = response['display-error'].@code;
if('ERROR_INVALID_USER_ID' == message) {
}
message = response['display-message'].@code.toString();
// TO BE DONE : what is best in case account could not be deleted ?
switch(message) {
case 'MSG_USER_ACCOUNT_REMOVED':
// SUCCESSDELETED.hidden = false;
break;
case 'MSG_USER_ACCOUNT_NOT_REMOVED':
// SUCCESSKEPT.hidden = false;
break;
default:
}
} catch(e) {
log.exception(e);
}
}
} catch(e) {
log.error("YOONO_CMPT.uninstall : " + e);
}
YOONO_SERVER.uninstall();
YOONO_BKM.uninstall();
YOONO_KEYVALUEDB.closeDB();
YOONO_STORAGE.closeStorage();
this.cleanupYoonoDir();
log.warn("Remove all yoono preferences");
PREFS.deleteBranch("");
this.uninstallDone = true;
}
this.cleanupYoonoDir = function () {
try {
var dir = this.getYoonoDir();
this.removeDirRecursive(dir);
} catch(e) {
log.error("Could not remove yoono dir: " + e);
}
}
this.getYoonoDir = function () {
var rootDir = DIRSERVICE.get("ProfDS", CI.nsIFile) ;
rootDir.append('yoono');
return(rootDir);
}
// Recursive removal of directory. Stolen with (little) shame from nsExtensionManager.js
// the file.remove method is recursive but will fail if file permissions are restrictive...
this.removeDirRecursive = function (aDir) {
try {
aDir.remove(true);
return;
} catch (e) {
}
var dirEntries = aDir.directoryEntries;
while (dirEntries.hasMoreElements()) {
var entry = dirEntries.getNext().QueryInterface(CI.nsIFile);
if (entry.isDirectory()) {
removeDirRecursive(entry);
} else {
entry.permissions = PERMS_FILE;
entry.remove(false);
}
}
aDir.permissions = PERMS_DIRECTORY;
aDir.remove(true);
}
this.loginMyYoonoPages = function(target, event, feedId, vsId) {
var userData = this.getUserCredential();
if(!userData || userData.anonymous) return;
// encoding, may contain utf8
var login = encodeURIComponent(userData.login);
var passwd = encodeURIComponent(userData.password);
var url = 'http://api.yoono.com/my-yoono/sign_in.jsp';
const MIME_STREAM_CID = "@mozilla.org/network/mime-input-stream;1";
const nsIMIMEInputStream = CI.nsIMIMEInputStream;
var mis = CL[MIME_STREAM_CID];
var headers = mis.createInstance(nsIMIMEInputStream);
headers.addHeader('X-Login', login);
headers.addHeader('X-Password', passwd);
if(!target) target = 'buzz';
if('webnote' == target) {
if(feedId) {
headers.addHeader('X-FeedId', feedId);
}
if(vsId) {
headers.addHeader('X-VsId', vsId);
}
}
headers.addHeader('X-Page', target);
var obj = Components.classes["@mozilla.org/io/string-input-stream;1"];
var iface = Components.interfaces.nsIStringInputStream;
var win = WMED.getMostRecentWindow("navigator:browser");
var nav = win.getWebNavigation();
// todo : open in tab according to mouse button. Pb : sending headers !
nav.loadURI(url, 0, null, null, headers);
}
this.hideYoonoStuff = function(win) {
this.closeSidebar(win);
this.hideYoonoButton(win);
}
this.closeSidebar = function(win) {
win.yoonoGlob.sidebar.hide();
}
this.hideYoonoButton = function(win) {
doc = win.document;
var toggle = doc.getElementById('yoono-toggle-sb');
if(toggle) toggle.setAttribute('hidden', 'true');
}
}
chromeUI.prototype = {
QueryInterface : function (iid) {
if(!iid.equals(CI.nsISupports) && !iid.equals(CI.nsIObserver))
throw Components.results.NS_ERROR_NO_INTERFACE;
return this;
},
// l objet doit obligatoirement comporter une methode observe
observe: function(aSubject, aTopic, aData) {
YOONO_LOG.debug('YOONO_CMPT.observe : ' + aTopic);
switch(aTopic) {
case "app-startup":
var obsSvc = CL["@mozilla.org/observer-service;1"].getService(CI.nsIObserverService);
obsSvc.addObserver(this, "profile-after-change", false);
obsSvc.addObserver(this, "quit-application", false);
// LQ-20060925
obsSvc.addObserver(this, "profile-before-change", false);
obsSvc.addObserver(this, "profile-after-change", false);
obsSvc.addObserver(this, "xpcom-shutdown", false);
break;
case "profile-after-change":
break;
case "quit-application":
this.getYServices().observer.notifyObservers("app.quit",null);
// Close the local database
YOONO_KEYVALUEDB.closeDB();
// LQ-20060925
YOONO_PREFS.storeLastModified(aTopic);
try {
if(this.uninstallWhenQuitting) {
this.getYServices().observer.notifyObservers("app.uninstall",null);
this.uninstall();
}
} catch(e) {
YOONO_LOG.exception(e);
}
break;
// LQ-20060925
case "profile-before-change":
YOONO_PREFS.storeLastModified(aTopic);
break;
case "profile-after-change":
YOONO_PREFS.storeLastModified(aTopic);
break;
case "xpcom-shutdown":
YOONO_PREFS.storeLastModified(aTopic);
break;
default:
throw Components.Exception("Unknown topic: " + aTopic);
}
}
};
//
var YOONO_CMPT = new chromeUI();
} catch(e) {
var console = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
console.logStringMessage(e);
}